package custom.base.ui.activity;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;

import com.hjq.toast.ToastUtils;

import java.util.LinkedList;
import java.util.List;

import custom.base.utils.store.ConstantsPreference;
import custom.base.utils.store.PreferencesManager;

/**
 * 应用程序Activity管理类
 *
 * @author jph
 */
public class AppManager {

    private List<Activity> activityList = new LinkedList<>();

    private static AppManager instance;

    private AppManager() {
    }

    private static synchronized void syncInit() {
        if (instance == null) {
            instance = new AppManager();
        }
    }

    public static AppManager getInstance() {
        if (instance == null) {
            syncInit();
        }
        return instance;
    }

    // 添加Activity 到容器中
    public void addActivity(Activity activity) {
        activityList.add(activity);
    }

    public void removeActivity(Activity activity) {
        activityList.remove(activity);
    }

    /**
     * 通过完整的类名找到Activity
     */
    public Activity findActivityByClassName(Class<?> clazz) {

        for (Activity activity : activityList) {
            if (activity.getClass().getName().equals(clazz.getName())) {
                return activity;
            }
        }

        return null;
    }

    /**
     * 除了该activity关闭其余activity
     */
    public void finishALlActivityExceptClassName(Class<?> clazz) {
        for (Activity activity : activityList) {
            if (!activity.getClass().getName().equals(clazz.getName())) {
                activity.finish();
            }
        }
    }

    /**
     * 根据类名关闭activity
     */
    public void finishActivitysByClassName(Class<?>... className) {
        for (int i = 0; i < className.length; i++) {
            Activity activity = findActivityByClassName(className[i]);
            if (activity != null) {
                activity.finish();
            }
        }
    }

    /**
     * 得到当前的activity
     */
    private Activity getCurrentActivity() {
        if (activityList == null || activityList.size() == 0) return null;
        return activityList.get(activityList.size() - 1);
    }


    /**
     * 退出系统
     */
    public void exit() {
        finishAllActivity();
        System.exit(0);

    }

    /**
     * 关闭所有activity
     */
    public void finishAllActivity() {
        for (Activity activity : activityList) {
            activity.finish();
        }
    }

    /**
     * 关闭所有activity除了传入的activity
     *
     * @param eActivity 不关闭的activity
     */
    public void finishAllActivityExcept(Activity eActivity) {

        for (Activity activity : activityList) {
            if (!activity.equals(eActivity))
                activity.finish();
        }
    }

    /**
     * 判断activity是否已经存在
     */
    public boolean activityExists(Class<?> clazz) {
        for (Activity activity : activityList) {
            if (activity.getClass().getName().equals(clazz.getName()))
                return true;
        }
        return false;
    }

    /**
     * 重启APP分为软重启和硬重启
     * 软重启则是关掉APP所有界面直接重启，此重启方式一定会成功。
     * 硬重启APP是杀掉本应用的进程，利用service的自启动来进行app重启，此重启需要配合service自动重启，而且重启会有一定的延时，但是重启比软重启安全，但不是一定重启成功。
     *
     * @param isCoolReboot      是否冷启动
     * @param context           环境
     * @param cls               重启后的打开页面(仅软重启有效)
     * @param killProcessCustom 由于某些框架需要自定义杀进程方法，例如阿里热更新或微信热更新，所以在调用的时候提供自定义杀进程方式
     */
    public void rebootApplication(Context context, boolean isCoolReboot, Class<?> cls, KillProcessCustom killProcessCustom) {
        if (isCoolReboot) {//冷重启
            PreferencesManager.getInstance(context).putBoolean(ConstantsPreference.REBOOT_AUTO_FLAG, true);
            finishAllActivity();
            //由于某些框架需要自定义杀进程方法，例如阿里热更新或微信热更新，所以在调用的时候提供自定义杀进程方式
            if (killProcessCustom != null) {
                killProcessCustom.killProcess();
            } else {
                android.os.Process.killProcess(android.os.Process.myPid());
            }
            ToastUtils.show("正在重启请稍后");
        } else {//热重启
            finishAllActivity();
            context.startActivity(new Intent(context, cls));
        }
    }

    /**
     * 重启APP分为软重启和硬重启
     * 软重启则是关掉APP所有界面直接重启，此重启方式一定会成功。
     * 硬重启APP是杀掉本应用的进程，利用service的自启动来进行app重启，此重启需要配合service自动重启，而且重启会有一定的延时，但是重启比软重启安全，但不是一定重启成功。
     *
     * @param isCoolReboot 是否冷启动
     * @param context      环境
     * @param cls          重启后的打开页面(仅软重启有效)
     */
    public void rebootApplication(Context context, boolean isCoolReboot, Class<?> cls) {
        rebootApplication(context, isCoolReboot, cls, null);
    }

    public interface KillProcessCustom {
        void killProcess();
    }

}
